﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dukou.Domain;
using NHibernate;

namespace Dukou.Dao
{
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="TId"></typeparam>
    public interface INHibernateDao<T, TId> : IEntityDao<T, TId> where T : IEntity<TId>
    {
        ISession Session { get; }

        ISessionFactory SessionFactory { get; set; }

        /// <summary>
        /// 从会话缓存移除所有对象，并且取消所有保存、修改、删除
        /// </summary>
        void Clear();

        /// <summary>
        /// 从会话缓存中移除指定对象
        /// </summary>
        /// <param name="entity"></param>
        void Evict(T entity);

        /// <summary>
        /// 拷贝指定对象到持久态对象（一样的标识）。
        /// 如果当前会话中没有持久态对象，会从数据库中加载。
        /// 返回持久态对象。
        /// 如果指定对象是未保存，保存指定对象副本并返回新的持久态对象。
        /// 指定对象不会和会话建立关系。
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        T Merge(T entity);
    }
}
